/*
 * Quercia Luciano
 * Algoritmi e Strutture Dati
 * a.a. 2009-10
 */


#include <iostream>
using std::cout;
using std::cin;
using std::endl;


#include "bst.h"


int main() {

	Bst<int> tree;

	tree.inserisci(10);
	tree.inserisci(15);
	tree.inserisci(5);
	tree.inserisci(1);
	tree.inserisci(2);
	tree.inserisci(3);
	tree.inserisci(4);
	tree.inserisci(6);
	tree.inserisci(7);
	tree.inserisci(8);
	tree.inserisci(9);
	tree.inserisci(11);
	tree.inserisci(12);
	tree.inserisci(13);
	tree.inserisci(14);
	tree.inserisci(16);
	tree.inserisci(17);
	tree.inserisci(18);
	tree.inserisci(19);
	tree.inserisci(20);

	/*
			  10
		   /	 \
		  5		  15
		 / \     /  \
		1	6	11	 16
		 \   \    \   \
		  2   7	  12   17
		   \   \    \   \
			3   8	13	 18
			 \   \    \   \
			  4   9	  14   19
					        \
							 20
	*/
	tree.leggi();

	cout << "MINIMO = " << tree.minimo() << endl;
	cout << "MASSIMO = " << tree.massimo() << endl;

	cout << "SUCCESSORE DI 5 = " << tree.successore(5) << endl;
	cout << "SUCCESSORE DI 1 = " << tree.successore(1) << endl;
	cout << "SUCCESSORE DI 17 = " << tree.successore(17) << endl;
	cout << "SUCCESSORE DI 19 = " << tree.successore(19) << endl;
	cout << "PREDECESSORE DI 2 = " << tree.predecessore(2) << endl;
	cout << "PREDECESSORE DI 13 = " << tree.predecessore(13) << endl;
	cout << "PREDECESSORE DI 20 = " << tree.predecessore(20) << endl;
	cout << "PREDECESSORE DI 15 = " << tree.predecessore(15) << endl;

	tree.leggi();

	tree.cancella(5); //due figli
	tree.cancella(19); //un figlio
	tree.cancella(20); //foglia

	cout << endl << "DOPO LA CANCELLAZIONE DI 5, 19, 20: " << endl;
	tree.leggi();
	cout << "MINIMO = " << tree.minimo() << endl;
	cout << "MASSIMO = " << tree.massimo() << endl;


	tree.cancellaTutto();
	cout << "DOPO LA CANCELLAZIONE DI TUTTO: " << endl;
	tree.print();
	cout << endl;

	try {
		cout << "MINIMO = " ;
		cout << tree.minimo() << endl;
	} catch (char const * mex) {
		cout << mex << endl;
	}

	try {
		cout << "MASSIMO = " ;
		cout << tree.massimo() << endl;
	} catch (char const * mex) {
		cout << mex << endl;
	}
	return 0;
}
